from math import cos,pi,sqrt

def pretty(m):
	#funcion que imprime una matriz
	print '\n'.join([' '.join(map(str,line)) for line in m])

def productoria(li):
	return reduce(lambda x,y:x*y, li, 1)

def sano(n):
	#algoritmo magico :D
	return int(round(productoria([sqrt(sqrt(4*cos(pi*j/(n+1))**2+4*cos(pi*k/(n+1))**2)) for k in range(1,n+1) for j in range(1,n+1)])))


f=open('Tp1Ej3.in') #abro archivo de entrada

while True: #recorro los casos de prueba
	n=int(f.readline()) #n es el tamanio del array
	if n<0: break #n==-1 significa que se acabaron los casos
	m=[[x=='#' and 1 or 0 for x in f.readline().strip()] for line in range(n)] # en m guardo la matriz (lista de listas)
	# 1 es una celda sana libre. 0 es una celda rota. x es celda ocupada. v es ficha vertical. h es ficha horizontal
		
	if reduce(lambda x,y: x and y,reduce(lambda x,y:x+y, m)): #chequeo si esta toda sana
		print sano(n) #si esta toda sana uso el algoritmo copado :P
		continue #y paso al proximo caso
	
	acc=0 # contador de las distintas posibilidades
	pos=0 # posicion en la que estoy parado (entre 0 y n*n) (pos%n es la columna, pos/n es la fila)
	direccion=1 #direccion en la que estoy recorriendo. empiezo yendo para adelante
	
	while True:		
		if pos==n*n: # se termino el tablero!
			acc+=1 # es porque encontre una solucion
			pos-=1 #vuelvo 1
			direccion=-1 #empiezo a ir para atras (para cambiar algunas fichas de lugar)
		elif pos==-1: #termine!!!!
			break #salgo del loop
		
		i,j=pos/n,pos%n # i,j son los indices en la matriz (dada la pos)
		
		if direccion==1: #si estoy yendo para adelante..
			if m[i][j]==1: #si esta posicion esta sana..
				if i<n-1 and m[i+1][j]==1: #si hay espacio para poner una ficha verticalmente
					m[i][j]='v' # marco esta posicion con una v
					m[i+1][j]='x' # y marco la posicion de abajo como ocupada
				elif j<n-1 and m[i][j+1]==1: #si hay espacio para poner una ficha horizontalmente
					m[i][j]='h' # marco esta posicion con una h
					m[i][j+1]='x' # y marco la posicion de al lado como ocupada
					pos+=1 # de paso aumento el pos porque es obvio que la proxima esta ocupada..
					i,j=pos/n,pos%n #actualizo los indices..
				else: # no hay espacio para poner una ficha!! este camino no anduvo!
					i,j=pos/n,pos%n #actualizo los indices..
					direccion=-1 # empiezo a ir para atras.
			else: # si estaba ocupada o rota
				pass #no hago nada :P

		else: #si estoy yendo para atras..
			if m[i][j]=='v': #si me encuentro con una ficha puesta verticalmente..
				#voy a probar de poner esta ficha horizontalmente
				if j<n-1 and m[i][j+1]:
					m[i+1][j]=1 #saco la ficha vertical que estaba
					m[i][j]='h' #pongo una horizontal
					m[i][j+1]='x' #(y ocupo la proxima celda)
					direccion=1 # y empiezo a ir para adelante buscando combinaciones nuevas
				else: #si no puedo ponerla horizontalmente
					m[i][j]=1 #saco la anterior
					m[i+1][j]=1
			elif m[i][j]=='h': #si me encuentro con una ficha puesta horizontalmente..
				m[i][j]=1 # la saco
				m[i][j+1]=1
			
		pos+=direccion #me muevo una celda en el sentido de la direccion
	print acc
